#ifndef __VIDEO_ENCODER_H__
#define __VIDEO_ENCODER_H__

#include <stdint.h>
#include <cstddef>
#include <memory>


// 视频编码器类型枚举
typedef enum VideoCodecType {
    VIDEO_CODEC_X264,
    // 可以添加其他编码器类型
}VideoCodecType;

// 编码器基类
class VideoEncoder {
public:
    // 参数定义
    struct encSetting {
        encSetting() {
            fps = 15;
            frame_skip = false;
        }
        uint32_t width; // 视频宽
        uint32_t height; // 视频高
        uint32_t bitrate_bps; // 目标码率 kpbs
        uint32_t fps; // 帧率
        bool frame_skip; // 是否开启跳帧
        uint32_t qp; // qp值
    };
    
    // 创建编码器的静态接口
    static std::shared_ptr<VideoEncoder> Create(VideoCodecType type);

    virtual ~VideoEncoder() {}

    // 打开编码器
    virtual bool Open(const encSetting& param) = 0;

    // 重新配置编码器
    virtual void ReConfigure(const encSetting& param) = 0;

    // 返回编码器的参数
    virtual encSetting GetConfig() = 0;

    // 编码
    virtual bool Encode(
        const uint8_t** yuv_data,// uint8_t* yuv_data[3]
        uint8_t* pkt,
        size_t& pkt_size,
        bool& is_keyframe,
        bool& got_output
    ) = 0;

    // 编码
    virtual bool Encode(
        const uint8_t* yuv_data,
        uint8_t* pkt,
        size_t& pkt_size,
        bool& is_keyframe,
        bool& got_output
    ) = 0;

    // 请求关键帧
    virtual void ForceKeyframe() = 0;

    // 关闭编码器
    virtual void Close() = 0;
};


#endif